"""
================================================================================
                     ------------utf-8--------------
================================================================================
@Author: rfdsg
@Create Time: 2023/7/12 - 23:34
@Description:
@Attention:该文件只能导入外部库，不允许导入内部库
"""
import os
from typing import Union
import pandas as pd


def inits_or_fresh(path: str = None, i_or_f: bool = True, data: DS = None):
    """

    Args:

        path: i_or_f为True时作为原文件存储路径，否则为初设文件的存储路径
        i_or_f: 是否更新或初设文件，True为更新，默认True
        data: 用于建立或添加的数据

    Returns:
        None

    """
    if data is None:
        raise ValueError('输入数据为空')
    if i_or_f and os.path.exists(path):
        # 只在文件存在且 `i_or_f=True` 时读取
        factor: pd.DataFrame = pd.read_pickle(path)
        # 直接合并数据，避免多层 try-except
        common_cols = list(set(factor.columns) & set(data.columns))
        if common_cols:
            factor.update(data[common_cols])  # 直接更新已有列
        factor = factor.combine_first(data)
        # 处理索引去重
        factor = factor.loc[~factor.index.duplicated(keep="last")]
    else:
        factor = data  # 直接初始化
    # 统一时间索引 & 排序
    factor.index = pd.to_datetime(factor.index, errors='coerce')
    factor.sort_index(inplace=True)

    # 存储
    pd.to_pickle(factor, path)


def for_csv(path: str = None, data: Union[pd.DataFrame, pd.Series] = None):
    """

    Args:
        path: i_or_f为True时作为原文件存储路径，否则为初设文件的存储路径
        data: 用于建立或添加的数据

    Returns:
        None

    """
    if os.path.exists(path):
        # 新的数据 data 填加到后半部分
        data.to_csv(path, mode='a', header=False, index=False)
    else:
        # 如果 CSV 文件不存在，则跳过
        data.to_csv(path, index=False)
